intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Chris Wilson <chris@chris-wilson.co.uk>
To: intel-gfx@lists.freedesktop.org
Cc: Ben Widawsky <ben@bwidawsk.net>
Subject: Re: [PATCH 07/10] intel-gpu-tools: register range handling for forcewake hooks
Date: Wed, 13 Jul 2011 22:15:42 +0100	[thread overview]
Message-ID: <aefc95$q2spd@orsmga001.jf.intel.com> (raw)
In-Reply-To: <1310590312-21669-8-git-send-email-ben@bwidawsk.net>

On Wed, 13 Jul 2011 13:51:49 -0700, Ben Widawsky <ben@bwidawsk.net> wrote:
Non-text part: multipart/mixed
> We can deprecate the old code by using the non-safe flag in the new API.
> The safe flag should allow the previous behavior to continue.
> 
> The code also adds some range checking on register access. This code is
> gives hooks to prevent tools from doing bad things.
> 
> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> ---
>  lib/Makefile.am       |    1 +
>  lib/intel_chipset.h   |    8 ++
>  lib/intel_gpu_tools.h |   27 ++++++++
>  lib/intel_mmio.c      |  178 +++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/intel_reg_map.c   |  174 +++++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 388 insertions(+), 0 deletions(-)
> 
> diff --git a/lib/Makefile.am b/lib/Makefile.am
> index 0c9380d..4612cd5 100644
> --- a/lib/Makefile.am
> +++ b/lib/Makefile.am
> @@ -8,6 +8,7 @@ libintel_tools_la_SOURCES = \
>  	intel_mmio.c \
>  	intel_pci.c \
>  	intel_reg.h \
> +	intel_reg_map.c \
>  	instdone.c \
>  	instdone.h \
>  	drmtest.h
> diff --git a/lib/intel_chipset.h b/lib/intel_chipset.h
> index c3db3ab..a38f661 100755
> --- a/lib/intel_chipset.h
> +++ b/lib/intel_chipset.h
> @@ -168,3 +168,11 @@
>  
>  #define HAS_BLT_RING(devid)	(IS_GEN6(devid) || \
>  				 IS_GEN7(devid))
> +
> +#define IS_BROADWATER(devid)	(devid == PCI_CHIP_I946_GZ || \
> +				 devid == PCI_CHIP_I965_G_1 || \
> +				 devid == PCI_CHIP_I965_Q || \
> +				 devid == PCI_CHIP_I965_G)
> +
> +#define IS_CRESTLINE(devid)	(devid == PCI_CHIP_I965_GM || \
> +				 devid == PCI_CHIP_I965_GME)
> diff --git a/lib/intel_gpu_tools.h b/lib/intel_gpu_tools.h
> index acee657..a145fb9 100644
> --- a/lib/intel_gpu_tools.h
> +++ b/lib/intel_gpu_tools.h
> @@ -37,6 +37,33 @@
>  extern void *mmio;
>  void intel_get_mmio(struct pci_device *pci_dev);
>  
> +/* New style register access API */
> +int intel_register_access_init(struct pci_device *pci_dev, int safe);
> +void intel_register_access_fini(void);
> +uint32_t intel_register_read(uint32_t reg);
> +void intel_register_write(uint32_t reg, uint32_t val);
> +
> +#define INTEL_RANGE_RSVD	(0<<0) /*  Shouldn't be read or written */
> +#define INTEL_RANGE_READ	(1<<0)
> +#define INTEL_RANGE_WRITE	(1<<1)
> +#define INTEL_RANGE_RW		(INTEL_RANGE_READ | INTEL_RANGE_WRITE)
> +#define INTEL_RANGE_END		(1<<31)
> +
> +struct intel_register_range {
> +	uint32_t base;
> +	uint32_t size;
> +	uint32_t flags;
> +};
> +
> +struct intel_register_map {
> +	struct intel_register_range *map;
> +	uint32_t top;
> +	uint32_t alignment_mask;
> +};
> +struct intel_register_map intel_get_register_map(uint32_t devid);
> +struct intel_register_range *intel_get_register_range(struct intel_register_map map, uint32_t offset, int mode);
> +
> +
>  static inline uint32_t
>  INREG(uint32_t reg)
>  {
> diff --git a/lib/intel_mmio.c b/lib/intel_mmio.c
> index 0228a87..05cde4f 100644
> --- a/lib/intel_mmio.c
> +++ b/lib/intel_mmio.c
> @@ -22,12 +22,15 @@
>   *
>   * Authors:
>   *    Eric Anholt <eric@anholt.net>
> + *    Ben Widawsky <ben@bwidawsk.net>
>   *
>   */
>  
>  #include <unistd.h>
>  #include <stdlib.h>
>  #include <stdio.h>
> +#include <stdint.h>
> +#include <stdbool.h>
>  #include <string.h>
>  #include <errno.h>
>  #include <err.h>
> @@ -41,6 +44,16 @@
>  
>  void *mmio;
>  
> +static struct _mmio_data {
> +	int inited;
> +	bool safe;
> +	char debugfs_path[FILENAME_MAX];
> +	char debugfs_forcewake_path[FILENAME_MAX];
> +	uint32_t i915_devid;
> +	struct intel_register_map map;
> +	int key;
> +} mmio_data;
> +
>  void
>  intel_map_file(char *file)
>  {
> @@ -89,3 +102,168 @@ intel_get_mmio(struct pci_device *pci_dev)
>  	}
>  }
>  
> +/*
> + * If successful, i915_debugfs_path and i915_debugfs_forcewake_path are both
> + * updated with the correct path.
> + */
> +static int
> +find_debugfs_path(char *dri_base)
> +{
> +	int i;
> +	char buf[FILENAME_MAX];
> +	char name[256];
> +	char pciid[256];
> +	FILE *file;
> +
> +	for (i = 0; i < 16; i++) {
> +		int n;
> +		snprintf(buf, FILENAME_MAX, "%s/%i/name", dri_base, i);
> +
> +		file = fopen(buf, "r");
> +		if (file == NULL)
> +			continue;
> +
> +		/*
> +		 *if (master->unique) {
> +		 *	seq_printf(m, "%s %s %s\n",
> +		 *		   bus_name,
> +		 *		   dev_name(dev->dev), master->unique);
> +		 *} else {
> +		 *	seq_printf(m, "%s %s\n",
> +		 *	bus_name, dev_name(dev->dev));
> +		 *}
> +		 */
> +		n = fscanf(file, "%s %s ", name, pciid);
> +		fclose (file);
> +
> +		if (n != 2)
> +			continue;
> +
> +		if (strncmp("0000:00:02.0", pciid, strlen("0000:00:02.0")))
> +			continue;

We'd like to maintain the option of someday handling more than one
adaptor. We have the pciid, that should be enough to identify it as a
supported Intel gfx chipset?

> +		snprintf(mmio_data.debugfs_path, FILENAME_MAX,
> +			 "%s/%i/", dri_base, i);
> +		snprintf(mmio_data.debugfs_forcewake_path, FILENAME_MAX,
> +			 "%s/%i/i915_forcewake_user", dri_base, i);
> +
And this file won't even exist otherwise... You need a stat here to
confirm that it does.

> +		return 0;
> +	}
> +
> +	return -1;
> +}
> +
> +/* force wake locking is stubbed out until accepted upstream */
> +static int
> +get_forcewake_lock(void)
> +{
> +	return open(mmio_data.debugfs_forcewake_path, 0);
> +}
> +
> +static void
> +release_forcewake_lock(int fd)
> +{
> +	close(fd);
> +}
> +
> +/*
> + * Initialize register access library.
> + *
> + * @pci_dev: pci device we're mucking with
> + * @safe: use safe register access tables
> + */
> +int
> +intel_register_access_init(struct pci_device *pci_dev, int safe)
> +{
> +	int ret;
> +
> +	/* after old API is deprecated, remove this */
> +	if (mmio == NULL)
> +		intel_get_mmio(pci_dev);
> +
> +	assert(mmio != NULL);
> +
> +	if (mmio_data.inited)
> +		return -1;
> +
> +	mmio_data.safe = safe != 0 ? true : false;
> +
> +	/* Find where the forcewake lock is */
> +	ret = find_debugfs_path("/sys/kernel/debug/dri");
Need to try /debug afterwards, just because that's the other convention.

> +	if (ret) {
> +		fprintf(stderr, "Couldn't find path to dri/debugfs entry\n");
> +		return ret;
> +	}
> +
> +	mmio_data.i915_devid = pci_dev->device_id;
> +	if (mmio_data.safe)
> +		mmio_data.map = intel_get_register_map(mmio_data.i915_devid);
> +
> +	mmio_data.key = get_forcewake_lock();
> +	mmio_data.inited++;
> +	return 0;
> +}
> +
> +void
> +intel_register_access_fini(void)
> +{
> +	release_forcewake_lock(mmio_data.key);
> +	mmio_data.inited--;
> +}
> +
> +uint32_t
> +intel_register_read(uint32_t reg)
> +{
> +	struct intel_register_range *range;
> +	uint32_t ret;
> +
> +	assert(mmio_data.inited);
> +
> +	if (IS_GEN6(mmio_data.i915_devid))
> +		assert(mmio_data.key != -1);
> +
> +	if (!mmio_data.safe)
> +		goto read_out;
> +
> +	range = intel_get_register_range(mmio_data.map,
> +					 reg,
> +					 INTEL_RANGE_READ);
> +
> +	if(!range) {
        if (!range) {


> +struct intel_register_map
> +intel_get_register_map(uint32_t devid)
> +{
> +	struct intel_register_map map;
> +
> +	if (IS_GEN6(devid)) {
> +		map.map = gen6_gt_register_map;
> +		map.top = 0x180000;
> +	} else if (IS_BROADWATER(devid) || IS_CRESTLINE(devid)) {
> +		map.map = gen_bwcl_register_map;
> +		map.top = 0x80000;
> +	} else if (IS_GEN4(devid) || IS_GEN5(devid)) {
> +		map.map = gen4_register_map;
> +		map.top = 0x80000;
> +	} else {
> +		abort();
Give us some warning that this function will die horribly on gen2/3!
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

  reply	other threads:[~2011-07-13 21:15 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-13 20:51 [PATCH 0/10] fs shader debugging Ben Widawsky
2011-07-13 20:51 ` [PATCH 01/10] intel: shared header for " Ben Widawsky
2011-07-13 20:56   ` Chris Wilson
2011-07-19 21:06   ` [Intel-gfx] " Julien Cristau
2011-07-21 13:54     ` Ben Widawsky
2011-07-21 21:22       ` [Intel-gfx] " Julien Cristau
2011-07-27 15:08         ` Ben Widawsky
2011-07-27 15:16           ` Julien Cristau
2011-07-27 15:28             ` Alan Cox
2011-07-27 15:40             ` Ben Widawsky
2011-07-13 20:51 ` [PATCH 02/10] i965: copy in system routine, reserve extra scratch Ben Widawsky
2011-07-18 18:13   ` Eric Anholt
2011-07-13 20:51 ` [PATCH 03/10] i965: Reserve scratch space for debugger communication Ben Widawsky
2011-07-13 20:51 ` [PATCH 04/10] i965: setup system routine Ben Widawsky
2011-07-13 21:04   ` [Mesa-dev] " Chris Wilson
2011-07-13 20:51 ` [PATCH 05/10] i965: emit breakpoints Ben Widawsky
2011-07-13 20:51 ` [PATCH 06/10] i965: attach to a listening debugger Ben Widawsky
2011-07-13 20:51 ` [PATCH 07/10] intel-gpu-tools: register range handling for forcewake hooks Ben Widawsky
2011-07-13 21:15   ` Chris Wilson [this message]
2011-07-13 20:51 ` [PATCH 08/10] intel-gpu-tools/forcewaked: simple forcewake app Ben Widawsky
2011-07-13 21:18   ` Chris Wilson
2011-07-13 20:51 ` [PATCH 09/10] debugging: add important debug regs Ben Widawsky
2011-07-13 21:20   ` Chris Wilson
2011-07-13 20:51 ` [PATCH 10/10] debugging: shader debugging Ben Widawsky
2011-07-13 22:06 ` [PATCH 0/10] fs " Ben Widawsky
2011-07-17 23:25 [PATCH 00/10] fs debugging: incorporated Chris' feedback Ben Widawsky
2011-07-17 23:25 ` [PATCH 07/10] intel-gpu-tools: register range handling for forcewake hooks Ben Widawsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='aefc95$q2spd@orsmga001.jf.intel.com' \
    --to=chris@chris-wilson.co.uk \
    --cc=ben@bwidawsk.net \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).