From: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>,
Ben Skeggs <bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: Re: [PATCH] bios: fix OF loading
Date: Fri, 2 Oct 2015 09:18:54 +0200 [thread overview]
Message-ID: <560E2FDE.6080808@redhat.com> (raw)
In-Reply-To: <1443757281-20834-1-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
Hi,
On 02-10-15 05:41, Ilia Mirkin wrote:
<nothing>
As someone who has recently started following nouveau I must say that
it would greatly help me (and likely others) if patches likes this would
come with a somewhat more descriptive commit message.
Otherwise keep up the good work!
Regards,
Hans
p.s.
I've seen your message on the mesa fire demo on nv34, firing that up now.
> Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
> ---
>
> Tested on a PowerMac7,3 with a NV34 AGP adapter.
>
> drm/nouveau/nvkm/subdev/bios/priv.h | 3 +++
> drm/nouveau/nvkm/subdev/bios/shadow.c | 27 ++++++++++++++++++---------
> drm/nouveau/nvkm/subdev/bios/shadowof.c | 18 ++++++++++++++++--
> 3 files changed, 37 insertions(+), 11 deletions(-)
>
> diff --git a/drm/nouveau/nvkm/subdev/bios/priv.h b/drm/nouveau/nvkm/subdev/bios/priv.h
> index e0ec2a6..212800e 100644
> --- a/drm/nouveau/nvkm/subdev/bios/priv.h
> +++ b/drm/nouveau/nvkm/subdev/bios/priv.h
> @@ -8,7 +8,10 @@ struct nvbios_source {
> void *(*init)(struct nvkm_bios *, const char *);
> void (*fini)(void *);
> u32 (*read)(void *, u32 offset, u32 length, struct nvkm_bios *);
> + u32 (*size)(void *);
> bool rw;
> + bool ignore_checksum;
> + bool no_pcir;
> };
>
> int nvbios_extend(struct nvkm_bios *, u32 length);
> diff --git a/drm/nouveau/nvkm/subdev/bios/shadow.c b/drm/nouveau/nvkm/subdev/bios/shadow.c
> index 792f017..b2557e8 100644
> --- a/drm/nouveau/nvkm/subdev/bios/shadow.c
> +++ b/drm/nouveau/nvkm/subdev/bios/shadow.c
> @@ -45,7 +45,7 @@ shadow_fetch(struct nvkm_bios *bios, struct shadow *mthd, u32 upto)
> u32 read = mthd->func->read(data, start, limit - start, bios);
> bios->size = start + read;
> }
> - return bios->size >= limit;
> + return bios->size >= upto;
> }
>
> static int
> @@ -55,14 +55,22 @@ shadow_image(struct nvkm_bios *bios, int idx, u32 offset, struct shadow *mthd)
> struct nvbios_image image;
> int score = 1;
>
> - if (!shadow_fetch(bios, mthd, offset + 0x1000)) {
> - nvkm_debug(subdev, "%08x: header fetch failed\n", offset);
> - return 0;
> - }
> + if (mthd->func->no_pcir) {
> + image.base = 0;
> + image.type = 0;
> + image.size = mthd->func->size(mthd->data);
> + image.last = 1;
> + } else {
> + if (!shadow_fetch(bios, mthd, offset + 0x1000)) {
> + nvkm_debug(subdev, "%08x: header fetch failed\n",
> + offset);
> + return 0;
> + }
>
> - if (!nvbios_image(bios, idx, &image)) {
> - nvkm_debug(subdev, "image %d invalid\n", idx);
> - return 0;
> + if (!nvbios_image(bios, idx, &image)) {
> + nvkm_debug(subdev, "image %d invalid\n", idx);
> + return 0;
> + }
> }
> nvkm_debug(subdev, "%08x: type %02x, %d bytes\n",
> image.base, image.type, image.size);
> @@ -74,7 +82,8 @@ shadow_image(struct nvkm_bios *bios, int idx, u32 offset, struct shadow *mthd)
>
> switch (image.type) {
> case 0x00:
> - if (nvbios_checksum(&bios->data[image.base], image.size)) {
> + if (!mthd->func->ignore_checksum &&
> + nvbios_checksum(&bios->data[image.base], image.size)) {
> nvkm_debug(subdev, "%08x: checksum failed\n",
> image.base);
> if (mthd->func->rw)
> diff --git a/drm/nouveau/nvkm/subdev/bios/shadowof.c b/drm/nouveau/nvkm/subdev/bios/shadowof.c
> index 29a37f0..4a20584 100644
> --- a/drm/nouveau/nvkm/subdev/bios/shadowof.c
> +++ b/drm/nouveau/nvkm/subdev/bios/shadowof.c
> @@ -22,6 +22,7 @@
> */
> #include "priv.h"
>
> +#include <core/pci.h>
>
> #if defined(__powerpc__)
> struct priv {
> @@ -33,17 +34,27 @@ static u32
> of_read(void *data, u32 offset, u32 length, struct nvkm_bios *bios)
> {
> struct priv *priv = data;
> - if (offset + length <= priv->size) {
> + if (offset < priv->size) {
> + length = min_t(u32, length, priv->size - offset);
> memcpy_fromio(bios->data + offset, priv->data + offset, length);
> return length;
> }
> return 0;
> }
>
> +static u32
> +of_size(void *data)
> +{
> + struct priv *priv = data;
> +
> + return priv->size;
> +}
> +
> static void *
> of_init(struct nvkm_bios *bios, const char *name)
> {
> - struct pci_dev *pdev = bios->subdev.device->pdev;
> + struct nvkm_device *device = bios->subdev.device;
> + struct pci_dev *pdev = device->func->pci(device)->pdev;
> struct device_node *dn;
> struct priv *priv;
> if (!(dn = pci_device_to_OF_node(pdev)))
> @@ -62,7 +73,10 @@ nvbios_of = {
> .init = of_init,
> .fini = (void(*)(void *))kfree,
> .read = of_read,
> + .size = of_size,
> .rw = false,
> + .ignore_checksum = true,
> + .no_pcir = true,
> };
> #else
> const struct nvbios_source
>
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau
next prev parent reply other threads:[~2015-10-02 7:18 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-02 3:41 [PATCH] bios: fix OF loading Ilia Mirkin
[not found] ` <1443757281-20834-1-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
2015-10-02 7:18 ` Hans de Goede [this message]
[not found] ` <560E2FDE.6080808-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-02 7:26 ` Ilia Mirkin
[not found] ` <CAKb7Uvisw2kHN=Nsi797W5QfsvqAOib0Y_3Q6O=HXdMAm1rNew-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-10-02 7:35 ` Hans de Goede
[not found] ` <560E33BB.8030706-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-02 7:38 ` Ilia Mirkin
[not found] ` <CAKb7Uvjskt7TR+_7ff9tM2z6hTe8aiNyMZHGRNQFNKvgKhPKkQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-10-02 7:39 ` Hans de Goede
[not found] ` <560E34CD.4010806-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-02 18:26 ` Ilia Mirkin
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=560E2FDE.6080808@redhat.com \
--to=hdegoede-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
--cc=bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org \
--cc=nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.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 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.