From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 07/10] drm/i915/dmc: add support to load dmc_header version 3
Date: Thu, 23 May 2019 16:27:55 -0700 [thread overview]
Message-ID: <20190523232755.GC4441@intel.com> (raw)
In-Reply-To: <20190523192533.3jqsung32hgu2mvy@ldmartin-desk.amr.corp.intel.com>
On Thu, May 23, 2019 at 12:25:34PM -0700, Lucas De Marchi wrote:
> On Thu, May 23, 2019 at 11:57:19AM -0700, Rodrigo Vivi wrote:
> > On Thu, May 23, 2019 at 01:24:17AM -0700, Lucas De Marchi wrote:
> > > Main difference is that now there are up to 20 MMIOs that can be set and
> > > a lot of noise due to the struct changing the fields in the middle.
> > >
> > > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> > > ---
> > > drivers/gpu/drm/i915/i915_drv.h | 4 +-
> > > drivers/gpu/drm/i915/intel_csr.c | 107 +++++++++++++++++++++++--------
> > > 2 files changed, 83 insertions(+), 28 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> > > index 1ad3818d2676..04a6b59256fd 100644
> > > --- a/drivers/gpu/drm/i915/i915_drv.h
> > > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > > @@ -354,8 +354,8 @@ struct intel_csr {
> > > u32 dmc_fw_size; /* dwords */
> > > u32 version;
> > > u32 mmio_count;
> > > - i915_reg_t mmioaddr[8];
> > > - u32 mmiodata[8];
> > > + i915_reg_t mmioaddr[20];
> > > + u32 mmiodata[20];
> > > u32 dc_state;
> > > u32 allowed_dc_mask;
> > > intel_wakeref_t wakeref;
> > > diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
> > > index 20dd4bd5feae..ad4ee55a8c5e 100644
> > > --- a/drivers/gpu/drm/i915/intel_csr.c
> > > +++ b/drivers/gpu/drm/i915/intel_csr.c
> > > @@ -72,6 +72,8 @@ MODULE_FIRMWARE(BXT_CSR_PATH);
> > > #define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF
> > > #define PACKAGE_MAX_FW_INFO_ENTRIES 20
> > > #define PACKAGE_V2_MAX_FW_INFO_ENTRIES 32
> > > +#define DMC_V1_MAX_MMIO_COUNT 8
> > > +#define DMC_V3_MAX_MMIO_COUNT 20
> > >
> > > struct intel_css_header {
> > > /* 0x09 for DMC */
> > > @@ -143,7 +145,7 @@ struct intel_package_header {
> > > u32 num_entries;
> > > } __packed;
> > >
> > > -struct intel_dmc_header {
> > > +struct intel_dmc_header_base {
> > > /* always value would be 0x40403E3E */
> > > u32 signature;
> > >
> > > @@ -164,22 +166,47 @@ struct intel_dmc_header {
> > >
> > > /* Major Minor version */
> > > u32 fw_version;
> > > +} __packed;
> > > +
> > > +struct intel_dmc_header_v1 {
> > > + struct intel_dmc_header_base base;
> > >
> > > /* Number of valid MMIO cycles present. */
> > > u32 mmio_count;
> > >
> > > /* MMIO address */
> > > - u32 mmioaddr[8];
> > > + u32 mmioaddr[DMC_V1_MAX_MMIO_COUNT];
> > >
> > > /* MMIO data */
> > > - u32 mmiodata[8];
> > > + u32 mmiodata[DMC_V1_MAX_MMIO_COUNT];
> > >
> > > /* FW filename */
> > > - unsigned char dfile[32];
> > > + char dfile[32];
> > >
> > > u32 reserved1[2];
> > > } __packed;
> > >
> > > +struct intel_dmc_header_v3 {
> > > + struct intel_dmc_header_base base;
> > > +
> > > + /* DMC RAM start MMIO address */
> > > + u32 start_mmioaddr;
> > > +
> > > + u32 reserved[9];
> > > +
> > > + /* FW filename */
> > > + char dfile[32];
> > > +
> > > + /* Number of valid MMIO cycles present. */
> > > + u32 mmio_count;
> > > +
> > > + /* MMIO address */
> > > + u32 mmioaddr[DMC_V3_MAX_MMIO_COUNT];
> > > +
> > > + /* MMIO data */
> > > + u32 mmiodata[DMC_V3_MAX_MMIO_COUNT];
> > > +} __packed;
> > > +
> > > struct stepping_info {
> > > char stepping;
> > > char substepping;
> > > @@ -333,37 +360,67 @@ static u32 find_dmc_fw_offset(const struct intel_fw_info *fw_info,
> > > }
> > >
> > > static u32 parse_csr_fw_dmc(struct intel_csr *csr,
> > > - const struct intel_dmc_header *dmc_header)
> > > + const struct intel_dmc_header_base *dmc_header)
> > > {
> > > - unsigned int i, payload_size;
> > > - u32 r;
> > > + unsigned int header_len_bytes, dmc_header_size, payload_size, i;
> > > + const u32 *mmioaddr, *mmiodata;
> > > + u32 mmio_count, mmio_count_max;
> > > u8 *payload;
> > >
> > > - if (sizeof(struct intel_dmc_header) != dmc_header->header_len) {
> > > + BUILD_BUG_ON(ARRAY_SIZE(csr->mmioaddr) < DMC_V3_MAX_MMIO_COUNT ||
> > > + ARRAY_SIZE(csr->mmioaddr) < DMC_V1_MAX_MMIO_COUNT);
> > > +
> > > + /* Cope with small differences between v1 and v3 */
> > > + if (dmc_header->header_ver == 3) {
> >
> > I'm missing on this patch something like:
> >
> > - /* 0x01, 0x02 */
> > + /* 0x01, 0x02, 0x03 */
> > near header_ver definition
> >
> > or maybe kill that comment at all...
>
> nah, that is another version and it's a bit confusing. But we have
> *package* header version: 1 or 2
> *dmc* header version: 1 or 3
>
> Overall structure of the firmware:
>
> .------------.
> | CSS Header |
> |------------|
> | Package |
> | Header |
> |------------|
> | 20 or 32 | * 20 for package header v1
> | fw_info |--.-.-. 32 for package header v2
> |------------|<-' | |
> | DMC header | | |
> | DMC payload| | |
> |------------|<---' |
> | DMC header | |
> | DMC payload| |
> |------------| .
> ... .
> |------------|<-----'
> | DMC header |
> | DMC payload|
> '------------'
>
> here the dmc_header v3 will dictate how the *DMC header*
> will be parsed, that can have either 8 or 20 MMIOs to be programmed,
> besides the firmware to be loaded.
Ahh! I got it now.
Thanks for detailing it out.
>
> I guess I could add a patch on top with this sketch as a comment to
> better explain how is the layout of the file.
That is a good idea! :)
Thanks,
Rodrigo.
>
>
> Lucas De Marchi
>
> >
> > The rest seems right so feel free to use
> > Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> >
> > > + const struct intel_dmc_header_v3 *v3 =
> > > + (const struct intel_dmc_header_v3 *)dmc_header;
> > > +
> > > + mmioaddr = v3->mmioaddr;
> > > + mmiodata = v3->mmiodata;
> > > + mmio_count = v3->mmio_count;
> > > + mmio_count_max = DMC_V3_MAX_MMIO_COUNT;
> > > + /* header_len is in dwords */
> > > + header_len_bytes = dmc_header->header_len * 4;
> > > + dmc_header_size = sizeof(*v3);
> > > + } else if (dmc_header->header_ver == 1) {
> > > + const struct intel_dmc_header_v1 *v1 =
> > > + (const struct intel_dmc_header_v1 *)dmc_header;
> > > +
> > > + mmioaddr = v1->mmioaddr;
> > > + mmiodata = v1->mmiodata;
> > > + mmio_count = v1->mmio_count;
> > > + mmio_count_max = DMC_V1_MAX_MMIO_COUNT;
> > > + header_len_bytes = dmc_header->header_len;
> > > + dmc_header_size = sizeof(*v1);
> > > + } else {
> > > + DRM_ERROR("Unknown DMC fw header version: %u\n",
> > > + dmc_header->header_ver);
> > > + return 0;
> > > + }
> > > +
> > > + if (header_len_bytes != dmc_header_size) {
> > > DRM_ERROR("DMC firmware has wrong dmc header length "
> > > - "(%u bytes)\n",
> > > - (dmc_header->header_len));
> > > + "(%u bytes)\n", header_len_bytes);
> > > return 0;
> > > }
> > >
> > > /* Cache the dmc header info. */
> > > - if (dmc_header->mmio_count > ARRAY_SIZE(csr->mmioaddr)) {
> > > - DRM_ERROR("DMC firmware has wrong mmio count %u\n",
> > > - dmc_header->mmio_count);
> > > + if (mmio_count > mmio_count_max) {
> > > + DRM_ERROR("DMC firmware has wrong mmio count %u\n", mmio_count);
> > > return 0;
> > > }
> > >
> > > - csr->mmio_count = dmc_header->mmio_count;
> > > - for (i = 0; i < dmc_header->mmio_count; i++) {
> > > - if (dmc_header->mmioaddr[i] < CSR_MMIO_START_RANGE ||
> > > - dmc_header->mmioaddr[i] > CSR_MMIO_END_RANGE) {
> > > + for (i = 0; i < mmio_count; i++) {
> > > + if (mmioaddr[i] < CSR_MMIO_START_RANGE ||
> > > + mmioaddr[i] > CSR_MMIO_END_RANGE) {
> > > DRM_ERROR("DMC firmware has wrong mmio address 0x%x\n",
> > > - dmc_header->mmioaddr[i]);
> > > + mmioaddr[i]);
> > > return 0;
> > > }
> > > - csr->mmioaddr[i] = _MMIO(dmc_header->mmioaddr[i]);
> > > - csr->mmiodata[i] = dmc_header->mmiodata[i];
> > > + csr->mmioaddr[i] = _MMIO(mmioaddr[i]);
> > > + csr->mmiodata[i] = mmiodata[i];
> > > }
> > > + csr->mmio_count = mmio_count;
> > >
> > > /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
> > > payload_size = dmc_header->fw_size * 4;
> > > @@ -379,12 +436,10 @@ static u32 parse_csr_fw_dmc(struct intel_csr *csr,
> > > return 0;
> > > }
> > >
> > > - r = sizeof(struct intel_dmc_header);
> > > - payload = (u8 *)(dmc_header) + r;
> > > + payload = (u8 *)(dmc_header) + header_len_bytes;
> > > memcpy(csr->dmc_payload, payload, payload_size);
> > > - r += payload_size;
> > >
> > > - return r;
> > > + return header_len_bytes + payload_size;
> > > }
> > >
> > > static u32
> > > @@ -470,7 +525,7 @@ static u32 *parse_csr_fw(struct drm_i915_private *dev_priv,
> > > {
> > > struct intel_css_header *css_header;
> > > struct intel_package_header *package_header;
> > > - struct intel_dmc_header *dmc_header;
> > > + struct intel_dmc_header_base *dmc_header;
> > > struct intel_csr *csr = &dev_priv->csr;
> > > const struct stepping_info *si = intel_get_stepping_info(dev_priv);
> > > u32 readcount = 0;
> > > @@ -496,7 +551,7 @@ static u32 *parse_csr_fw(struct drm_i915_private *dev_priv,
> > > readcount += r;
> > >
> > > /* Extract dmc_header information. */
> > > - dmc_header = (struct intel_dmc_header *)&fw->data[readcount];
> > > + dmc_header = (struct intel_dmc_header_base *)&fw->data[readcount];
> > > r = parse_csr_fw_dmc(csr, dmc_header);
> > > if (!r)
> > > return NULL;
> > > --
> > > 2.21.0
> > >
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2019-05-23 23:27 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-23 8:24 [PATCH 01/10] drm/i915/dmc: use kernel types Lucas De Marchi
2019-05-23 8:24 ` [PATCH 02/10] drm/i915/dmc: extract fw_info and table walk from intel_package_header Lucas De Marchi
2019-05-23 17:36 ` Rodrigo Vivi
2019-05-23 17:45 ` Srivatsa, Anusha
2019-05-23 8:24 ` [PATCH 03/10] drm/i915/dmc: add support for package_header with version 2 Lucas De Marchi
2019-05-23 17:43 ` Rodrigo Vivi
2019-05-23 17:55 ` Lucas De Marchi
2019-05-23 17:49 ` Srivatsa, Anusha
2019-05-23 8:24 ` [PATCH 04/10] drm/i915/dmc: extract function to parse css header Lucas De Marchi
2019-05-23 17:45 ` Rodrigo Vivi
2019-05-23 17:51 ` Srivatsa, Anusha
2019-05-23 8:24 ` [PATCH 05/10] drm/i915/dmc: extract function to parse package_header Lucas De Marchi
2019-05-23 18:03 ` Srivatsa, Anusha
2019-05-23 8:24 ` [PATCH 06/10] drm/i915/dmc: extract function to parse dmc_header Lucas De Marchi
2019-05-23 18:22 ` Srivatsa, Anusha
2019-05-23 8:24 ` [PATCH 07/10] drm/i915/dmc: add support to load dmc_header version 3 Lucas De Marchi
2019-05-23 18:26 ` Srivatsa, Anusha
2019-05-23 18:57 ` Rodrigo Vivi
2019-05-23 19:25 ` Lucas De Marchi
2019-05-23 23:27 ` Rodrigo Vivi [this message]
2019-05-23 8:24 ` [PATCH 08/10] drm/i915/dmc: remove redundant return in parse_csr_fw() Lucas De Marchi
2019-05-23 18:28 ` Srivatsa, Anusha
2019-05-23 8:24 ` [PATCH 09/10] drm/i915/dmc: protect against reading random memory Lucas De Marchi
2019-05-23 18:58 ` Rodrigo Vivi
2019-05-23 19:41 ` Lucas De Marchi
2019-05-23 8:24 ` [PATCH 10/10] drm/i915/dmc: protect against loading wrong firmware Lucas De Marchi
2019-05-23 19:00 ` Rodrigo Vivi
2019-05-23 16:13 ` ✓ Fi.CI.BAT: success for series starting with [01/10] drm/i915/dmc: use kernel types Patchwork
2019-05-23 17:32 ` [PATCH 01/10] " Srivatsa, Anusha
2019-05-23 17:34 ` Rodrigo Vivi
2019-05-24 23:56 ` ✓ Fi.CI.IGT: success for series starting with [01/10] " Patchwork
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=20190523232755.GC4441@intel.com \
--to=rodrigo.vivi@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=lucas.demarchi@intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.