Commit 9ac63d99 authored by Dave Airlie's avatar Dave Airlie

Merge branch 'linux-4.10' of git://github.com/skeggsb/linux into drm-next

- BIT_PERF_PTRS uses 32-bit pointers to its subtables, we were parsing
them as 16-bit, causing various issues on newer boards.
- Support for MXM on GM20x and up.
- More display-related fixes.

* 'linux-4.10' of git://github.com/skeggsb/linux:
  drm/nouveau/mxm: warn more loudly on unsupported DCB version
  drm/nouveau/mxm: handle DCB 4.1 modification
  drm/nouveau/bios/mxm: handle digital connector table 1.1
  drm/nouveau: Queue hpd_work on (runtime) resume
  drm/nouveau: Rename acpi_work to hpd_work
  drm/nouveau/kms/nv50: Fix atomic pageflip events.
  drm/nouveau/fb/ram/gp100-: fix memory detection where FBP_NUM != FBPA_NUM
  drm/nouveau/bios/volt: pointers are 32-bit
  drm/nouveau/bios/vmap: pointers are 32-bit
  drm/nouveau/bios/timing: pointers are 32-bit
  drm/nouveau/bios/therm: pointers are 32-bit
  drm/nouveau/bios/perf: pointers are 32-bit
  drm/nouveau/bios/iccsense: pointers are 32-bit
  drm/nouveau/bios/fan: pointers are 32-bit
  drm/nouveau/bios/cstep: pointers are 32-bit
  drm/nouveau/bios/boost: pointers are 32-bit
parents f03ee46b a8f6cb7b
#ifndef __NVBIOS_BOOST_H__ #ifndef __NVBIOS_BOOST_H__
#define __NVBIOS_BOOST_H__ #define __NVBIOS_BOOST_H__
u16 nvbios_boostTe(struct nvkm_bios *, u8 *, u8 *, u8 *, u8 *, u8 *, u8 *); u32 nvbios_boostTe(struct nvkm_bios *, u8 *, u8 *, u8 *, u8 *, u8 *, u8 *);
struct nvbios_boostE { struct nvbios_boostE {
u8 pstate; u8 pstate;
...@@ -8,10 +8,10 @@ struct nvbios_boostE { ...@@ -8,10 +8,10 @@ struct nvbios_boostE {
u32 max; u32 max;
}; };
u16 nvbios_boostEe(struct nvkm_bios *, int idx, u8 *, u8 *, u8 *, u8 *); u32 nvbios_boostEe(struct nvkm_bios *, int idx, u8 *, u8 *, u8 *, u8 *);
u16 nvbios_boostEp(struct nvkm_bios *, int idx, u8 *, u8 *, u8 *, u8 *, u32 nvbios_boostEp(struct nvkm_bios *, int idx, u8 *, u8 *, u8 *, u8 *,
struct nvbios_boostE *); struct nvbios_boostE *);
u16 nvbios_boostEm(struct nvkm_bios *, u8, u8 *, u8 *, u8 *, u8 *, u32 nvbios_boostEm(struct nvkm_bios *, u8, u8 *, u8 *, u8 *, u8 *,
struct nvbios_boostE *); struct nvbios_boostE *);
struct nvbios_boostS { struct nvbios_boostS {
...@@ -21,7 +21,7 @@ struct nvbios_boostS { ...@@ -21,7 +21,7 @@ struct nvbios_boostS {
u32 max; u32 max;
}; };
u16 nvbios_boostSe(struct nvkm_bios *, int, u16, u8 *, u8 *, u8, u8); u32 nvbios_boostSe(struct nvkm_bios *, int, u32, u8 *, u8 *, u8, u8);
u16 nvbios_boostSp(struct nvkm_bios *, int, u16, u8 *, u8 *, u8, u8, u32 nvbios_boostSp(struct nvkm_bios *, int, u32, u8 *, u8 *, u8, u8,
struct nvbios_boostS *); struct nvbios_boostS *);
#endif #endif
#ifndef __NVBIOS_CSTEP_H__ #ifndef __NVBIOS_CSTEP_H__
#define __NVBIOS_CSTEP_H__ #define __NVBIOS_CSTEP_H__
u16 nvbios_cstepTe(struct nvkm_bios *, u32 nvbios_cstepTe(struct nvkm_bios *,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *xnr, u8 *xsz); u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *xnr, u8 *xsz);
struct nvbios_cstepE { struct nvbios_cstepE {
...@@ -8,10 +8,10 @@ struct nvbios_cstepE { ...@@ -8,10 +8,10 @@ struct nvbios_cstepE {
u8 index; u8 index;
}; };
u16 nvbios_cstepEe(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr); u32 nvbios_cstepEe(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr);
u16 nvbios_cstepEp(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr, u32 nvbios_cstepEp(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr,
struct nvbios_cstepE *); struct nvbios_cstepE *);
u16 nvbios_cstepEm(struct nvkm_bios *, u8 pstate, u8 *ver, u8 *hdr, u32 nvbios_cstepEm(struct nvkm_bios *, u8 pstate, u8 *ver, u8 *hdr,
struct nvbios_cstepE *); struct nvbios_cstepE *);
struct nvbios_cstepX { struct nvbios_cstepX {
...@@ -20,7 +20,7 @@ struct nvbios_cstepX { ...@@ -20,7 +20,7 @@ struct nvbios_cstepX {
u8 voltage; u8 voltage;
}; };
u16 nvbios_cstepXe(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr); u32 nvbios_cstepXe(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr);
u16 nvbios_cstepXp(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr, u32 nvbios_cstepXp(struct nvkm_bios *, int idx, u8 *ver, u8 *hdr,
struct nvbios_cstepX *); struct nvbios_cstepX *);
#endif #endif
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
#define __NVBIOS_FAN_H__ #define __NVBIOS_FAN_H__
#include <subdev/bios/therm.h> #include <subdev/bios/therm.h>
u16 nvbios_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan); u32 nvbios_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan);
#endif #endif
#ifndef __NVBIOS_PERF_H__ #ifndef __NVBIOS_PERF_H__
#define __NVBIOS_PERF_H__ #define __NVBIOS_PERF_H__
u16 nvbios_perf_table(struct nvkm_bios *, u8 *ver, u8 *hdr, u32 nvbios_perf_table(struct nvkm_bios *, u8 *ver, u8 *hdr,
u8 *cnt, u8 *len, u8 *snr, u8 *ssz); u8 *cnt, u8 *len, u8 *snr, u8 *ssz);
struct nvbios_perfE { struct nvbios_perfE {
...@@ -17,9 +17,9 @@ struct nvbios_perfE { ...@@ -17,9 +17,9 @@ struct nvbios_perfE {
u8 pcie_width; u8 pcie_width;
}; };
u16 nvbios_perf_entry(struct nvkm_bios *, int idx, u32 nvbios_perf_entry(struct nvkm_bios *, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len); u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
u16 nvbios_perfEp(struct nvkm_bios *, int idx, u32 nvbios_perfEp(struct nvkm_bios *, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_perfE *); u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_perfE *);
struct nvbios_perfS { struct nvbios_perfS {
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
#define __NVBIOS_TIMING_H__ #define __NVBIOS_TIMING_H__
#include <subdev/bios/ramcfg.h> #include <subdev/bios/ramcfg.h>
u16 nvbios_timingTe(struct nvkm_bios *, u32 nvbios_timingTe(struct nvkm_bios *,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz); u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz);
u16 nvbios_timingEe(struct nvkm_bios *, int idx, u32 nvbios_timingEe(struct nvkm_bios *, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len); u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
u16 nvbios_timingEp(struct nvkm_bios *, int idx, u32 nvbios_timingEp(struct nvkm_bios *, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ramcfg *); u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ramcfg *);
#endif #endif
...@@ -6,8 +6,8 @@ struct nvbios_vmap { ...@@ -6,8 +6,8 @@ struct nvbios_vmap {
u8 max2; u8 max2;
}; };
u16 nvbios_vmap_table(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len); u32 nvbios_vmap_table(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
u16 nvbios_vmap_parse(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u32 nvbios_vmap_parse(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
struct nvbios_vmap *); struct nvbios_vmap *);
struct nvbios_vmap_entry { struct nvbios_vmap_entry {
...@@ -18,7 +18,7 @@ struct nvbios_vmap_entry { ...@@ -18,7 +18,7 @@ struct nvbios_vmap_entry {
s32 arg[6]; s32 arg[6];
}; };
u16 nvbios_vmap_entry(struct nvkm_bios *, int idx, u8 *ver, u8 *len); u32 nvbios_vmap_entry(struct nvkm_bios *, int idx, u8 *ver, u8 *len);
u16 nvbios_vmap_entry_parse(struct nvkm_bios *, int idx, u8 *ver, u8 *len, u32 nvbios_vmap_entry_parse(struct nvkm_bios *, int idx, u8 *ver, u8 *len,
struct nvbios_vmap_entry *); struct nvbios_vmap_entry *);
#endif #endif
...@@ -22,8 +22,8 @@ struct nvbios_volt { ...@@ -22,8 +22,8 @@ struct nvbios_volt {
u32 pwm_range; u32 pwm_range;
}; };
u16 nvbios_volt_table(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len); u32 nvbios_volt_table(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
u16 nvbios_volt_parse(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u32 nvbios_volt_parse(struct nvkm_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
struct nvbios_volt *); struct nvbios_volt *);
struct nvbios_volt_entry { struct nvbios_volt_entry {
...@@ -31,7 +31,7 @@ struct nvbios_volt_entry { ...@@ -31,7 +31,7 @@ struct nvbios_volt_entry {
u8 vid; u8 vid;
}; };
u16 nvbios_volt_entry(struct nvkm_bios *, int idx, u8 *ver, u8 *len); u32 nvbios_volt_entry(struct nvkm_bios *, int idx, u8 *ver, u8 *len);
u16 nvbios_volt_entry_parse(struct nvkm_bios *, int idx, u8 *ver, u8 *len, u32 nvbios_volt_entry_parse(struct nvkm_bios *, int idx, u8 *ver, u8 *len,
struct nvbios_volt_entry *); struct nvbios_volt_entry *);
#endif #endif
...@@ -349,21 +349,10 @@ static struct nouveau_drm_prop_enum_list dither_depth[] = { ...@@ -349,21 +349,10 @@ static struct nouveau_drm_prop_enum_list dither_depth[] = {
} \ } \
} while(0) } while(0)
#ifdef CONFIG_ACPI
/*
* Hans de Goede: This define belongs in acpi/video.h, I've submitted a patch
* to the acpi subsys to move it there from drivers/acpi/acpi_video.c .
* This should be dropped once that is merged.
*/
#ifndef ACPI_VIDEO_NOTIFY_PROBE
#define ACPI_VIDEO_NOTIFY_PROBE 0x81
#endif
static void static void
nouveau_display_acpi_work(struct work_struct *work) nouveau_display_hpd_work(struct work_struct *work)
{ {
struct nouveau_drm *drm = container_of(work, typeof(*drm), acpi_work); struct nouveau_drm *drm = container_of(work, typeof(*drm), hpd_work);
pm_runtime_get_sync(drm->dev->dev); pm_runtime_get_sync(drm->dev->dev);
...@@ -373,6 +362,17 @@ nouveau_display_acpi_work(struct work_struct *work) ...@@ -373,6 +362,17 @@ nouveau_display_acpi_work(struct work_struct *work)
pm_runtime_put_sync(drm->dev->dev); pm_runtime_put_sync(drm->dev->dev);
} }
#ifdef CONFIG_ACPI
/*
* Hans de Goede: This define belongs in acpi/video.h, I've submitted a patch
* to the acpi subsys to move it there from drivers/acpi/acpi_video.c .
* This should be dropped once that is merged.
*/
#ifndef ACPI_VIDEO_NOTIFY_PROBE
#define ACPI_VIDEO_NOTIFY_PROBE 0x81
#endif
static int static int
nouveau_display_acpi_ntfy(struct notifier_block *nb, unsigned long val, nouveau_display_acpi_ntfy(struct notifier_block *nb, unsigned long val,
void *data) void *data)
...@@ -385,9 +385,9 @@ nouveau_display_acpi_ntfy(struct notifier_block *nb, unsigned long val, ...@@ -385,9 +385,9 @@ nouveau_display_acpi_ntfy(struct notifier_block *nb, unsigned long val,
/* /*
* This may be the only indication we receive of a * This may be the only indication we receive of a
* connector hotplug on a runtime suspended GPU, * connector hotplug on a runtime suspended GPU,
* schedule acpi_work to check. * schedule hpd_work to check.
*/ */
schedule_work(&drm->acpi_work); schedule_work(&drm->hpd_work);
/* acpi-video should not generate keypresses for this */ /* acpi-video should not generate keypresses for this */
return NOTIFY_BAD; return NOTIFY_BAD;
...@@ -582,8 +582,8 @@ nouveau_display_create(struct drm_device *dev) ...@@ -582,8 +582,8 @@ nouveau_display_create(struct drm_device *dev)
} }
nouveau_backlight_init(dev); nouveau_backlight_init(dev);
INIT_WORK(&drm->hpd_work, nouveau_display_hpd_work);
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
INIT_WORK(&drm->acpi_work, nouveau_display_acpi_work);
drm->acpi_nb.notifier_call = nouveau_display_acpi_ntfy; drm->acpi_nb.notifier_call = nouveau_display_acpi_ntfy;
register_acpi_notifier(&drm->acpi_nb); register_acpi_notifier(&drm->acpi_nb);
#endif #endif
......
...@@ -699,7 +699,12 @@ nouveau_pmops_resume(struct device *dev) ...@@ -699,7 +699,12 @@ nouveau_pmops_resume(struct device *dev)
return ret; return ret;
pci_set_master(pdev); pci_set_master(pdev);
return nouveau_do_resume(drm_dev, false); ret = nouveau_do_resume(drm_dev, false);
/* Monitors may have been connected / disconnected during suspend */
schedule_work(&nouveau_drm(drm_dev)->hpd_work);
return ret;
} }
static int static int
...@@ -773,6 +778,10 @@ nouveau_pmops_runtime_resume(struct device *dev) ...@@ -773,6 +778,10 @@ nouveau_pmops_runtime_resume(struct device *dev)
nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25)); nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25));
vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON); vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
/* Monitors may have been connected / disconnected during suspend */
schedule_work(&nouveau_drm(drm_dev)->hpd_work);
return ret; return ret;
} }
......
...@@ -163,9 +163,9 @@ struct nouveau_drm { ...@@ -163,9 +163,9 @@ struct nouveau_drm {
struct nvbios vbios; struct nvbios vbios;
struct nouveau_display *display; struct nouveau_display *display;
struct backlight_device *backlight; struct backlight_device *backlight;
struct work_struct hpd_work;
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
struct notifier_block acpi_nb; struct notifier_block acpi_nb;
struct work_struct acpi_work;
#endif #endif
/* power management */ /* power management */
......
...@@ -4090,6 +4090,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -4090,6 +4090,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
for_each_crtc_in_state(state, crtc, crtc_state, i) { for_each_crtc_in_state(state, crtc, crtc_state, i) {
if (crtc->state->event) { if (crtc->state->event) {
unsigned long flags; unsigned long flags;
/* Get correct count/ts if racing with vblank irq */
drm_accurate_vblank_count(crtc);
spin_lock_irqsave(&crtc->dev->event_lock, flags); spin_lock_irqsave(&crtc->dev->event_lock, flags);
drm_crtc_send_vblank_event(crtc, crtc->state->event); drm_crtc_send_vblank_event(crtc, crtc->state->event);
spin_unlock_irqrestore(&crtc->dev->event_lock, flags); spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
......
...@@ -25,16 +25,16 @@ ...@@ -25,16 +25,16 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/boost.h> #include <subdev/bios/boost.h>
u16 u32
nvbios_boostTe(struct nvkm_bios *bios, nvbios_boostTe(struct nvkm_bios *bios,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 boost = 0x0000; u32 boost = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2) if (bit_P.version == 2)
boost = nvbios_rd16(bios, bit_P.offset + 0x30); boost = nvbios_rd32(bios, bit_P.offset + 0x30);
if (boost) { if (boost) {
*ver = nvbios_rd08(bios, boost + 0); *ver = nvbios_rd08(bios, boost + 0);
...@@ -52,15 +52,15 @@ nvbios_boostTe(struct nvkm_bios *bios, ...@@ -52,15 +52,15 @@ nvbios_boostTe(struct nvkm_bios *bios,
} }
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_boostEe(struct nvkm_bios *bios, int idx, nvbios_boostEe(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len) u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
u8 snr, ssz; u8 snr, ssz;
u16 data = nvbios_boostTe(bios, ver, hdr, cnt, len, &snr, &ssz); u32 data = nvbios_boostTe(bios, ver, hdr, cnt, len, &snr, &ssz);
if (data && idx < *cnt) { if (data && idx < *cnt) {
data = data + *hdr + (idx * (*len + (snr * ssz))); data = data + *hdr + (idx * (*len + (snr * ssz)));
*hdr = *len; *hdr = *len;
...@@ -68,14 +68,14 @@ nvbios_boostEe(struct nvkm_bios *bios, int idx, ...@@ -68,14 +68,14 @@ nvbios_boostEe(struct nvkm_bios *bios, int idx,
*len = ssz; *len = ssz;
return data; return data;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_boostEp(struct nvkm_bios *bios, int idx, nvbios_boostEp(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info)
{ {
u16 data = nvbios_boostEe(bios, idx, ver, hdr, cnt, len); u32 data = nvbios_boostEe(bios, idx, ver, hdr, cnt, len);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
if (data) { if (data) {
info->pstate = (nvbios_rd16(bios, data + 0x00) & 0x01e0) >> 5; info->pstate = (nvbios_rd16(bios, data + 0x00) & 0x01e0) >> 5;
...@@ -85,7 +85,7 @@ nvbios_boostEp(struct nvkm_bios *bios, int idx, ...@@ -85,7 +85,7 @@ nvbios_boostEp(struct nvkm_bios *bios, int idx,
return data; return data;
} }
u16 u32
nvbios_boostEm(struct nvkm_bios *bios, u8 pstate, nvbios_boostEm(struct nvkm_bios *bios, u8 pstate,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_boostE *info)
{ {
...@@ -97,21 +97,21 @@ nvbios_boostEm(struct nvkm_bios *bios, u8 pstate, ...@@ -97,21 +97,21 @@ nvbios_boostEm(struct nvkm_bios *bios, u8 pstate,
return data; return data;
} }
u16 u32
nvbios_boostSe(struct nvkm_bios *bios, int idx, nvbios_boostSe(struct nvkm_bios *bios, int idx,
u16 data, u8 *ver, u8 *hdr, u8 cnt, u8 len) u32 data, u8 *ver, u8 *hdr, u8 cnt, u8 len)
{ {
if (data && idx < cnt) { if (data && idx < cnt) {
data = data + *hdr + (idx * len); data = data + *hdr + (idx * len);
*hdr = len; *hdr = len;
return data; return data;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_boostSp(struct nvkm_bios *bios, int idx, nvbios_boostSp(struct nvkm_bios *bios, int idx,
u16 data, u8 *ver, u8 *hdr, u8 cnt, u8 len, u32 data, u8 *ver, u8 *hdr, u8 cnt, u8 len,
struct nvbios_boostS *info) struct nvbios_boostS *info)
{ {
data = nvbios_boostSe(bios, idx, data, ver, hdr, cnt, len); data = nvbios_boostSe(bios, idx, data, ver, hdr, cnt, len);
......
...@@ -25,16 +25,16 @@ ...@@ -25,16 +25,16 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/cstep.h> #include <subdev/bios/cstep.h>
u16 u32
nvbios_cstepTe(struct nvkm_bios *bios, nvbios_cstepTe(struct nvkm_bios *bios,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *xnr, u8 *xsz) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *xnr, u8 *xsz)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 cstep = 0x0000; u32 cstep = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2) if (bit_P.version == 2)
cstep = nvbios_rd16(bios, bit_P.offset + 0x34); cstep = nvbios_rd32(bios, bit_P.offset + 0x34);
if (cstep) { if (cstep) {
*ver = nvbios_rd08(bios, cstep + 0); *ver = nvbios_rd08(bios, cstep + 0);
...@@ -52,27 +52,27 @@ nvbios_cstepTe(struct nvkm_bios *bios, ...@@ -52,27 +52,27 @@ nvbios_cstepTe(struct nvkm_bios *bios,
} }
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_cstepEe(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr) nvbios_cstepEe(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr)
{ {
u8 cnt, len, xnr, xsz; u8 cnt, len, xnr, xsz;
u16 data = nvbios_cstepTe(bios, ver, hdr, &cnt, &len, &xnr, &xsz); u32 data = nvbios_cstepTe(bios, ver, hdr, &cnt, &len, &xnr, &xsz);
if (data && idx < cnt) { if (data && idx < cnt) {
data = data + *hdr + (idx * len); data = data + *hdr + (idx * len);
*hdr = len; *hdr = len;
return data; return data;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_cstepEp(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr, nvbios_cstepEp(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr,
struct nvbios_cstepE *info) struct nvbios_cstepE *info)
{ {
u16 data = nvbios_cstepEe(bios, idx, ver, hdr); u32 data = nvbios_cstepEe(bios, idx, ver, hdr);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
if (data) { if (data) {
info->pstate = (nvbios_rd16(bios, data + 0x00) & 0x01e0) >> 5; info->pstate = (nvbios_rd16(bios, data + 0x00) & 0x01e0) >> 5;
...@@ -81,7 +81,7 @@ nvbios_cstepEp(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr, ...@@ -81,7 +81,7 @@ nvbios_cstepEp(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr,
return data; return data;
} }
u16 u32
nvbios_cstepEm(struct nvkm_bios *bios, u8 pstate, u8 *ver, u8 *hdr, nvbios_cstepEm(struct nvkm_bios *bios, u8 pstate, u8 *ver, u8 *hdr,
struct nvbios_cstepE *info) struct nvbios_cstepE *info)
{ {
...@@ -93,24 +93,24 @@ nvbios_cstepEm(struct nvkm_bios *bios, u8 pstate, u8 *ver, u8 *hdr, ...@@ -93,24 +93,24 @@ nvbios_cstepEm(struct nvkm_bios *bios, u8 pstate, u8 *ver, u8 *hdr,
return data; return data;
} }
u16 u32
nvbios_cstepXe(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr) nvbios_cstepXe(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr)
{ {
u8 cnt, len, xnr, xsz; u8 cnt, len, xnr, xsz;
u16 data = nvbios_cstepTe(bios, ver, hdr, &cnt, &len, &xnr, &xsz); u32 data = nvbios_cstepTe(bios, ver, hdr, &cnt, &len, &xnr, &xsz);
if (data && idx < xnr) { if (data && idx < xnr) {
data = data + *hdr + (cnt * len) + (idx * xsz); data = data + *hdr + (cnt * len) + (idx * xsz);
*hdr = xsz; *hdr = xsz;
return data; return data;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_cstepXp(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr, nvbios_cstepXp(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr,
struct nvbios_cstepX *info) struct nvbios_cstepX *info)
{ {
u16 data = nvbios_cstepXe(bios, idx, ver, hdr); u32 data = nvbios_cstepXe(bios, idx, ver, hdr);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
if (data) { if (data) {
info->freq = nvbios_rd16(bios, data + 0x00) * 1000; info->freq = nvbios_rd16(bios, data + 0x00) * 1000;
......
...@@ -25,15 +25,15 @@ ...@@ -25,15 +25,15 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/fan.h> #include <subdev/bios/fan.h>
static u16 static u32
nvbios_fan_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) nvbios_fan_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 fan = 0x0000; u32 fan = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2 && bit_P.length >= 0x5a) if (bit_P.version == 2 && bit_P.length >= 0x5a)
fan = nvbios_rd16(bios, bit_P.offset + 0x58); fan = nvbios_rd32(bios, bit_P.offset + 0x58);
if (fan) { if (fan) {
*ver = nvbios_rd08(bios, fan + 0); *ver = nvbios_rd08(bios, fan + 0);
...@@ -49,25 +49,25 @@ nvbios_fan_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) ...@@ -49,25 +49,25 @@ nvbios_fan_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
} }
} }
return 0x0000; return 0;
} }
static u16 static u32
nvbios_fan_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr, nvbios_fan_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *hdr,
u8 *cnt, u8 *len) u8 *cnt, u8 *len)
{ {
u16 data = nvbios_fan_table(bios, ver, hdr, cnt, len); u32 data = nvbios_fan_table(bios, ver, hdr, cnt, len);
if (data && idx < *cnt) if (data && idx < *cnt)
return data + *hdr + (idx * (*len)); return data + *hdr + (idx * (*len));
return 0x0000; return 0;
} }
u16 u32
nvbios_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan) nvbios_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan)
{ {
u8 ver, hdr, cnt, len; u8 ver, hdr, cnt, len;
u16 data = nvbios_fan_entry(bios, 0, &ver, &hdr, &cnt, &len); u32 data = nvbios_fan_entry(bios, 0, &ver, &hdr, &cnt, &len);
if (data) { if (data) {
u8 type = nvbios_rd08(bios, data + 0x00); u8 type = nvbios_rd08(bios, data + 0x00);
switch (type) { switch (type) {
......
...@@ -26,18 +26,18 @@ ...@@ -26,18 +26,18 @@
#include <subdev/bios/extdev.h> #include <subdev/bios/extdev.h>
#include <subdev/bios/iccsense.h> #include <subdev/bios/iccsense.h>
static u16 static u32
nvbios_iccsense_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, nvbios_iccsense_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt,
u8 *len) u8 *len)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 iccsense; u32 iccsense;
if (bit_entry(bios, 'P', &bit_P) || bit_P.version != 2 || if (bit_entry(bios, 'P', &bit_P) || bit_P.version != 2 ||
bit_P.length < 0x2c) bit_P.length < 0x2c)
return 0; return 0;
iccsense = nvbios_rd16(bios, bit_P.offset + 0x28); iccsense = nvbios_rd32(bios, bit_P.offset + 0x28);
if (!iccsense) if (!iccsense)
return 0; return 0;
...@@ -61,7 +61,7 @@ nvbios_iccsense_parse(struct nvkm_bios *bios, struct nvbios_iccsense *iccsense) ...@@ -61,7 +61,7 @@ nvbios_iccsense_parse(struct nvkm_bios *bios, struct nvbios_iccsense *iccsense)
{ {
struct nvkm_subdev *subdev = &bios->subdev; struct nvkm_subdev *subdev = &bios->subdev;
u8 ver, hdr, cnt, len, i; u8 ver, hdr, cnt, len, i;
u16 table, entry; u32 table, entry;
table = nvbios_iccsense_table(bios, &ver, &hdr, &cnt, &len); table = nvbios_iccsense_table(bios, &ver, &hdr, &cnt, &len);
if (!table || !cnt) if (!table || !cnt)
......
...@@ -81,7 +81,7 @@ mxm_sor_map(struct nvkm_bios *bios, u8 conn) ...@@ -81,7 +81,7 @@ mxm_sor_map(struct nvkm_bios *bios, u8 conn)
u16 map = nvbios_rd16(bios, mxm + 4); u16 map = nvbios_rd16(bios, mxm + 4);
if (map) { if (map) {
ver = nvbios_rd08(bios, map); ver = nvbios_rd08(bios, map);
if (ver == 0x10) { if (ver == 0x10 || ver == 0x11) {
if (conn < nvbios_rd08(bios, map + 3)) { if (conn < nvbios_rd08(bios, map + 3)) {
map += nvbios_rd08(bios, map + 1); map += nvbios_rd08(bios, map + 1);
map += conn; map += conn;
......
...@@ -26,16 +26,16 @@ ...@@ -26,16 +26,16 @@
#include <subdev/bios/perf.h> #include <subdev/bios/perf.h>
#include <subdev/pci.h> #include <subdev/pci.h>
u16 u32
nvbios_perf_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, nvbios_perf_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr,
u8 *cnt, u8 *len, u8 *snr, u8 *ssz) u8 *cnt, u8 *len, u8 *snr, u8 *ssz)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 perf = 0x0000; u32 perf = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version <= 2) { if (bit_P.version <= 2) {
perf = nvbios_rd16(bios, bit_P.offset + 0); perf = nvbios_rd32(bios, bit_P.offset + 0);
if (perf) { if (perf) {
*ver = nvbios_rd08(bios, perf + 0); *ver = nvbios_rd08(bios, perf + 0);
*hdr = nvbios_rd08(bios, perf + 1); *hdr = nvbios_rd08(bios, perf + 1);
...@@ -72,15 +72,15 @@ nvbios_perf_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, ...@@ -72,15 +72,15 @@ nvbios_perf_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr,
} }
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_perf_entry(struct nvkm_bios *bios, int idx, nvbios_perf_entry(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len) u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
u8 snr, ssz; u8 snr, ssz;
u16 perf = nvbios_perf_table(bios, ver, hdr, cnt, len, &snr, &ssz); u32 perf = nvbios_perf_table(bios, ver, hdr, cnt, len, &snr, &ssz);
if (perf && idx < *cnt) { if (perf && idx < *cnt) {
perf = perf + *hdr + (idx * (*len + (snr * ssz))); perf = perf + *hdr + (idx * (*len + (snr * ssz)));
*hdr = *len; *hdr = *len;
...@@ -88,14 +88,14 @@ nvbios_perf_entry(struct nvkm_bios *bios, int idx, ...@@ -88,14 +88,14 @@ nvbios_perf_entry(struct nvkm_bios *bios, int idx,
*len = ssz; *len = ssz;
return perf; return perf;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_perfEp(struct nvkm_bios *bios, int idx, nvbios_perfEp(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_perfE *info) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_perfE *info)
{ {
u16 perf = nvbios_perf_entry(bios, idx, ver, hdr, cnt, len); u32 perf = nvbios_perf_entry(bios, idx, ver, hdr, cnt, len);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
info->pstate = nvbios_rd08(bios, perf + 0x00); info->pstate = nvbios_rd08(bios, perf + 0x00);
switch (!!perf * *ver) { switch (!!perf * *ver) {
...@@ -163,7 +163,7 @@ nvbios_perfEp(struct nvkm_bios *bios, int idx, ...@@ -163,7 +163,7 @@ nvbios_perfEp(struct nvkm_bios *bios, int idx,
info->pcie_width = 0xff; info->pcie_width = 0xff;
break; break;
default: default:
return 0x0000; return 0;
} }
return perf; return perf;
} }
...@@ -202,7 +202,7 @@ nvbios_perf_fan_parse(struct nvkm_bios *bios, ...@@ -202,7 +202,7 @@ nvbios_perf_fan_parse(struct nvkm_bios *bios,
struct nvbios_perf_fan *fan) struct nvbios_perf_fan *fan)
{ {
u8 ver, hdr, cnt, len, snr, ssz; u8 ver, hdr, cnt, len, snr, ssz;
u16 perf = nvbios_perf_table(bios, &ver, &hdr, &cnt, &len, &snr, &ssz); u32 perf = nvbios_perf_table(bios, &ver, &hdr, &cnt, &len, &snr, &ssz);
if (!perf) if (!perf)
return -ENODEV; return -ENODEV;
......
...@@ -25,17 +25,17 @@ ...@@ -25,17 +25,17 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/therm.h> #include <subdev/bios/therm.h>
static u16 static u32
therm_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *len, u8 *cnt) therm_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *len, u8 *cnt)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 therm = 0; u32 therm = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 1) if (bit_P.version == 1)
therm = nvbios_rd16(bios, bit_P.offset + 12); therm = nvbios_rd32(bios, bit_P.offset + 12);
else if (bit_P.version == 2) else if (bit_P.version == 2)
therm = nvbios_rd16(bios, bit_P.offset + 16); therm = nvbios_rd32(bios, bit_P.offset + 16);
else else
nvkm_error(&bios->subdev, nvkm_error(&bios->subdev,
"unknown offset for thermal in BIT P %d\n", "unknown offset for thermal in BIT P %d\n",
...@@ -44,7 +44,7 @@ therm_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *len, u8 *cnt) ...@@ -44,7 +44,7 @@ therm_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *len, u8 *cnt)
/* exit now if we haven't found the thermal table */ /* exit now if we haven't found the thermal table */
if (!therm) if (!therm)
return 0x0000; return 0;
*ver = nvbios_rd08(bios, therm + 0); *ver = nvbios_rd08(bios, therm + 0);
*hdr = nvbios_rd08(bios, therm + 1); *hdr = nvbios_rd08(bios, therm + 1);
...@@ -53,14 +53,14 @@ therm_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *len, u8 *cnt) ...@@ -53,14 +53,14 @@ therm_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *len, u8 *cnt)
return therm + nvbios_rd08(bios, therm + 1); return therm + nvbios_rd08(bios, therm + 1);
} }
static u16 static u32
nvbios_therm_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len) nvbios_therm_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len)
{ {
u8 hdr, cnt; u8 hdr, cnt;
u16 therm = therm_table(bios, ver, &hdr, len, &cnt); u32 therm = therm_table(bios, ver, &hdr, len, &cnt);
if (therm && idx < cnt) if (therm && idx < cnt)
return therm + idx * *len; return therm + idx * *len;
return 0x0000; return 0;
} }
int int
...@@ -70,7 +70,7 @@ nvbios_therm_sensor_parse(struct nvkm_bios *bios, ...@@ -70,7 +70,7 @@ nvbios_therm_sensor_parse(struct nvkm_bios *bios,
{ {
s8 thrs_section, sensor_section, offset; s8 thrs_section, sensor_section, offset;
u8 ver, len, i; u8 ver, len, i;
u16 entry; u32 entry;
/* we only support the core domain for now */ /* we only support the core domain for now */
if (domain != NVBIOS_THERM_DOMAIN_CORE) if (domain != NVBIOS_THERM_DOMAIN_CORE)
...@@ -154,7 +154,7 @@ nvbios_therm_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan) ...@@ -154,7 +154,7 @@ nvbios_therm_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan)
{ {
struct nvbios_therm_trip_point *cur_trip = NULL; struct nvbios_therm_trip_point *cur_trip = NULL;
u8 ver, len, i; u8 ver, len, i;
u16 entry; u32 entry;
uint8_t duty_lut[] = { 0, 0, 25, 0, 40, 0, 50, 0, uint8_t duty_lut[] = { 0, 0, 25, 0, 40, 0, 50, 0,
75, 0, 85, 0, 100, 0, 100, 0 }; 75, 0, 85, 0, 100, 0, 100, 0 };
......
...@@ -25,19 +25,19 @@ ...@@ -25,19 +25,19 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/timing.h> #include <subdev/bios/timing.h>
u16 u32
nvbios_timingTe(struct nvkm_bios *bios, nvbios_timingTe(struct nvkm_bios *bios,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, u8 *snr, u8 *ssz)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 timing = 0x0000; u32 timing = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 1) if (bit_P.version == 1)
timing = nvbios_rd16(bios, bit_P.offset + 4); timing = nvbios_rd32(bios, bit_P.offset + 4);
else else
if (bit_P.version == 2) if (bit_P.version == 2)
timing = nvbios_rd16(bios, bit_P.offset + 8); timing = nvbios_rd32(bios, bit_P.offset + 8);
if (timing) { if (timing) {
*ver = nvbios_rd08(bios, timing + 0); *ver = nvbios_rd08(bios, timing + 0);
...@@ -62,15 +62,15 @@ nvbios_timingTe(struct nvkm_bios *bios, ...@@ -62,15 +62,15 @@ nvbios_timingTe(struct nvkm_bios *bios,
} }
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_timingEe(struct nvkm_bios *bios, int idx, nvbios_timingEe(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len) u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
u8 snr, ssz; u8 snr, ssz;
u16 timing = nvbios_timingTe(bios, ver, hdr, cnt, len, &snr, &ssz); u32 timing = nvbios_timingTe(bios, ver, hdr, cnt, len, &snr, &ssz);
if (timing && idx < *cnt) { if (timing && idx < *cnt) {
timing += *hdr + idx * (*len + (snr * ssz)); timing += *hdr + idx * (*len + (snr * ssz));
*hdr = *len; *hdr = *len;
...@@ -78,14 +78,14 @@ nvbios_timingEe(struct nvkm_bios *bios, int idx, ...@@ -78,14 +78,14 @@ nvbios_timingEe(struct nvkm_bios *bios, int idx,
*len = ssz; *len = ssz;
return timing; return timing;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_timingEp(struct nvkm_bios *bios, int idx, nvbios_timingEp(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ramcfg *p) u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ramcfg *p)
{ {
u16 data = nvbios_timingEe(bios, idx, ver, hdr, cnt, len), temp; u32 data = nvbios_timingEe(bios, idx, ver, hdr, cnt, len), temp;
p->timing_ver = *ver; p->timing_ver = *ver;
p->timing_hdr = *hdr; p->timing_hdr = *hdr;
switch (!!data * *ver) { switch (!!data * *ver) {
......
...@@ -25,15 +25,15 @@ ...@@ -25,15 +25,15 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/vmap.h> #include <subdev/bios/vmap.h>
u16 u32
nvbios_vmap_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) nvbios_vmap_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 vmap = 0x0000; u32 vmap = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2) { if (bit_P.version == 2) {
vmap = nvbios_rd16(bios, bit_P.offset + 0x20); vmap = nvbios_rd32(bios, bit_P.offset + 0x20);
if (vmap) { if (vmap) {
*ver = nvbios_rd08(bios, vmap + 0); *ver = nvbios_rd08(bios, vmap + 0);
switch (*ver) { switch (*ver) {
...@@ -50,14 +50,14 @@ nvbios_vmap_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) ...@@ -50,14 +50,14 @@ nvbios_vmap_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
} }
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_vmap_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, nvbios_vmap_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
struct nvbios_vmap *info) struct nvbios_vmap *info)
{ {
u16 vmap = nvbios_vmap_table(bios, ver, hdr, cnt, len); u32 vmap = nvbios_vmap_table(bios, ver, hdr, cnt, len);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
switch (!!vmap * *ver) { switch (!!vmap * *ver) {
case 0x10: case 0x10:
...@@ -77,23 +77,23 @@ nvbios_vmap_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, ...@@ -77,23 +77,23 @@ nvbios_vmap_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
return vmap; return vmap;
} }
u16 u32
nvbios_vmap_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len) nvbios_vmap_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len)
{ {
u8 hdr, cnt; u8 hdr, cnt;
u16 vmap = nvbios_vmap_table(bios, ver, &hdr, &cnt, len); u32 vmap = nvbios_vmap_table(bios, ver, &hdr, &cnt, len);
if (vmap && idx < cnt) { if (vmap && idx < cnt) {
vmap = vmap + hdr + (idx * *len); vmap = vmap + hdr + (idx * *len);
return vmap; return vmap;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_vmap_entry_parse(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len, nvbios_vmap_entry_parse(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len,
struct nvbios_vmap_entry *info) struct nvbios_vmap_entry *info)
{ {
u16 vmap = nvbios_vmap_entry(bios, idx, ver, len); u32 vmap = nvbios_vmap_entry(bios, idx, ver, len);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
switch (!!vmap * *ver) { switch (!!vmap * *ver) {
case 0x10: case 0x10:
......
...@@ -25,18 +25,18 @@ ...@@ -25,18 +25,18 @@
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/volt.h> #include <subdev/bios/volt.h>
u16 u32
nvbios_volt_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) nvbios_volt_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
struct bit_entry bit_P; struct bit_entry bit_P;
u16 volt = 0x0000; u32 volt = 0;
if (!bit_entry(bios, 'P', &bit_P)) { if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2) if (bit_P.version == 2)
volt = nvbios_rd16(bios, bit_P.offset + 0x0c); volt = nvbios_rd32(bios, bit_P.offset + 0x0c);
else else
if (bit_P.version == 1) if (bit_P.version == 1)
volt = nvbios_rd16(bios, bit_P.offset + 0x10); volt = nvbios_rd32(bios, bit_P.offset + 0x10);
if (volt) { if (volt) {
*ver = nvbios_rd08(bios, volt + 0); *ver = nvbios_rd08(bios, volt + 0);
...@@ -62,14 +62,14 @@ nvbios_volt_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) ...@@ -62,14 +62,14 @@ nvbios_volt_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
} }
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_volt_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, nvbios_volt_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
struct nvbios_volt *info) struct nvbios_volt *info)
{ {
u16 volt = nvbios_volt_table(bios, ver, hdr, cnt, len); u32 volt = nvbios_volt_table(bios, ver, hdr, cnt, len);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
switch (!!volt * *ver) { switch (!!volt * *ver) {
case 0x12: case 0x12:
...@@ -119,23 +119,23 @@ nvbios_volt_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len, ...@@ -119,23 +119,23 @@ nvbios_volt_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
return volt; return volt;
} }
u16 u32
nvbios_volt_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len) nvbios_volt_entry(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len)
{ {
u8 hdr, cnt; u8 hdr, cnt;
u16 volt = nvbios_volt_table(bios, ver, &hdr, &cnt, len); u32 volt = nvbios_volt_table(bios, ver, &hdr, &cnt, len);
if (volt && idx < cnt) { if (volt && idx < cnt) {
volt = volt + hdr + (idx * *len); volt = volt + hdr + (idx * *len);
return volt; return volt;
} }
return 0x0000; return 0;
} }
u16 u32
nvbios_volt_entry_parse(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len, nvbios_volt_entry_parse(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len,
struct nvbios_volt_entry *info) struct nvbios_volt_entry *info)
{ {
u16 volt = nvbios_volt_entry(bios, idx, ver, len); u32 volt = nvbios_volt_entry(bios, idx, ver, len);
memset(info, 0x00, sizeof(*info)); memset(info, 0x00, sizeof(*info));
switch (!!volt * *ver) { switch (!!volt * *ver) {
case 0x12: case 0x12:
......
...@@ -44,13 +44,13 @@ nvkm_clk_adjust(struct nvkm_clk *clk, bool adjust, ...@@ -44,13 +44,13 @@ nvkm_clk_adjust(struct nvkm_clk *clk, bool adjust,
struct nvkm_bios *bios = clk->subdev.device->bios; struct nvkm_bios *bios = clk->subdev.device->bios;
struct nvbios_boostE boostE; struct nvbios_boostE boostE;
u8 ver, hdr, cnt, len; u8 ver, hdr, cnt, len;
u16 data; u32 data;
data = nvbios_boostEm(bios, pstate, &ver, &hdr, &cnt, &len, &boostE); data = nvbios_boostEm(bios, pstate, &ver, &hdr, &cnt, &len, &boostE);
if (data) { if (data) {
struct nvbios_boostS boostS; struct nvbios_boostS boostS;
u8 idx = 0, sver, shdr; u8 idx = 0, sver, shdr;
u16 subd; u32 subd;
input = max(boostE.min, input); input = max(boostE.min, input);
input = min(boostE.max, input); input = min(boostE.max, input);
...@@ -229,7 +229,7 @@ nvkm_cstate_new(struct nvkm_clk *clk, int idx, struct nvkm_pstate *pstate) ...@@ -229,7 +229,7 @@ nvkm_cstate_new(struct nvkm_clk *clk, int idx, struct nvkm_pstate *pstate)
struct nvkm_cstate *cstate = NULL; struct nvkm_cstate *cstate = NULL;
struct nvbios_cstepX cstepX; struct nvbios_cstepX cstepX;
u8 ver, hdr; u8 ver, hdr;
u16 data; u32 data;
data = nvbios_cstepXp(bios, idx, &ver, &hdr, &cstepX); data = nvbios_cstepXp(bios, idx, &ver, &hdr, &cstepX);
if (!data) if (!data)
...@@ -408,7 +408,7 @@ nvkm_pstate_new(struct nvkm_clk *clk, int idx) ...@@ -408,7 +408,7 @@ nvkm_pstate_new(struct nvkm_clk *clk, int idx)
struct nvbios_cstepE cstepE; struct nvbios_cstepE cstepE;
struct nvbios_perfE perfE; struct nvbios_perfE perfE;
u8 ver, hdr, cnt, len; u8 ver, hdr, cnt, len;
u16 data; u32 data;
data = nvbios_perfEp(bios, idx, &ver, &hdr, &cnt, &len, &perfE); data = nvbios_perfEp(bios, idx, &ver, &hdr, &cnt, &len, &perfE);
if (!data) if (!data)
......
...@@ -130,6 +130,7 @@ gm200_devinit_post(struct nvkm_devinit *base, bool post) ...@@ -130,6 +130,7 @@ gm200_devinit_post(struct nvkm_devinit *base, bool post)
/* upload first chunk of init data */ /* upload first chunk of init data */
if (post) { if (post) {
// devinit tables
u32 pmu = pmu_args(init, args + 0x08, 0x08); u32 pmu = pmu_args(init, args + 0x08, 0x08);
u32 img = nvbios_rd16(bios, bit_I.offset + 0x14); u32 img = nvbios_rd16(bios, bit_I.offset + 0x14);
u32 len = nvbios_rd16(bios, bit_I.offset + 0x16); u32 len = nvbios_rd16(bios, bit_I.offset + 0x16);
...@@ -138,6 +139,7 @@ gm200_devinit_post(struct nvkm_devinit *base, bool post) ...@@ -138,6 +139,7 @@ gm200_devinit_post(struct nvkm_devinit *base, bool post)
/* upload second chunk of init data */ /* upload second chunk of init data */
if (post) { if (post) {
// devinit boot scripts
u32 pmu = pmu_args(init, args + 0x08, 0x10); u32 pmu = pmu_args(init, args + 0x08, 0x10);
u32 img = nvbios_rd16(bios, bit_I.offset + 0x18); u32 img = nvbios_rd16(bios, bit_I.offset + 0x18);
u32 len = nvbios_rd16(bios, bit_I.offset + 0x1a); u32 len = nvbios_rd16(bios, bit_I.offset + 0x1a);
......
...@@ -92,13 +92,13 @@ gp100_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram) ...@@ -92,13 +92,13 @@ gp100_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
enum nvkm_ram_type type = nvkm_fb_bios_memtype(device->bios); enum nvkm_ram_type type = nvkm_fb_bios_memtype(device->bios);
const u32 rsvd_head = ( 256 * 1024); /* vga memory */ const u32 rsvd_head = ( 256 * 1024); /* vga memory */
const u32 rsvd_tail = (1024 * 1024); /* vbios etc */ const u32 rsvd_tail = (1024 * 1024); /* vbios etc */
u32 fbpa_num = nvkm_rd32(device, 0x022438), fbpa; u32 fbpa_num = nvkm_rd32(device, 0x02243c), fbpa;
u32 fbio_opt = nvkm_rd32(device, 0x021c14); u32 fbio_opt = nvkm_rd32(device, 0x021c14);
u64 part, size = 0, comm = ~0ULL; u64 part, size = 0, comm = ~0ULL;
bool mixed = false; bool mixed = false;
int ret; int ret;
nvkm_debug(subdev, "022438: %08x\n", fbpa_num); nvkm_debug(subdev, "02243c: %08x\n", fbpa_num);
nvkm_debug(subdev, "021c14: %08x\n", fbio_opt); nvkm_debug(subdev, "021c14: %08x\n", fbio_opt);
for (fbpa = 0; fbpa < fbpa_num; fbpa++) { for (fbpa = 0; fbpa < fbpa_num; fbpa++) {
if (!(fbio_opt & (1 << fbpa))) { if (!(fbio_opt & (1 << fbpa))) {
......
...@@ -190,8 +190,8 @@ mxm_dcb_sanitise(struct nvkm_mxm *mxm) ...@@ -190,8 +190,8 @@ mxm_dcb_sanitise(struct nvkm_mxm *mxm)
struct nvkm_bios *bios = subdev->device->bios; struct nvkm_bios *bios = subdev->device->bios;
u8 ver, hdr, cnt, len; u8 ver, hdr, cnt, len;
u16 dcb = dcb_table(bios, &ver, &hdr, &cnt, &len); u16 dcb = dcb_table(bios, &ver, &hdr, &cnt, &len);
if (dcb == 0x0000 || ver != 0x40) { if (dcb == 0x0000 || (ver != 0x40 && ver != 0x41)) {
nvkm_debug(subdev, "unsupported DCB version\n"); nvkm_warn(subdev, "unsupported DCB version\n");
return; return;
} }
......
...@@ -84,7 +84,7 @@ nvkm_volt_map_min(struct nvkm_volt *volt, u8 id) ...@@ -84,7 +84,7 @@ nvkm_volt_map_min(struct nvkm_volt *volt, u8 id)
struct nvkm_bios *bios = volt->subdev.device->bios; struct nvkm_bios *bios = volt->subdev.device->bios;
struct nvbios_vmap_entry info; struct nvbios_vmap_entry info;
u8 ver, len; u8 ver, len;
u16 vmap; u32 vmap;
vmap = nvbios_vmap_entry_parse(bios, id, &ver, &len, &info); vmap = nvbios_vmap_entry_parse(bios, id, &ver, &len, &info);
if (vmap) { if (vmap) {
...@@ -106,7 +106,7 @@ nvkm_volt_map(struct nvkm_volt *volt, u8 id, u8 temp) ...@@ -106,7 +106,7 @@ nvkm_volt_map(struct nvkm_volt *volt, u8 id, u8 temp)
struct nvkm_bios *bios = volt->subdev.device->bios; struct nvkm_bios *bios = volt->subdev.device->bios;
struct nvbios_vmap_entry info; struct nvbios_vmap_entry info;
u8 ver, len; u8 ver, len;
u16 vmap; u32 vmap;
vmap = nvbios_vmap_entry_parse(bios, id, &ver, &len, &info); vmap = nvbios_vmap_entry_parse(bios, id, &ver, &len, &info);
if (vmap) { if (vmap) {
...@@ -189,7 +189,7 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt) ...@@ -189,7 +189,7 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt)
struct nvbios_volt_entry ivid; struct nvbios_volt_entry ivid;
struct nvbios_volt info; struct nvbios_volt info;
u8 ver, hdr, cnt, len; u8 ver, hdr, cnt, len;
u16 data; u32 data;
int i; int i;
data = nvbios_volt_parse(bios, &ver, &hdr, &cnt, &len, &info); data = nvbios_volt_parse(bios, &ver, &hdr, &cnt, &len, &info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment